package com.example.demo.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.Mapper.RoleMapper;
import com.example.demo.context.BaseContext;
import com.example.demo.entity.Role;
import com.example.demo.result.Result;
import com.example.demo.service.RoleService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
@Slf4j
public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements RoleService {

    @Resource
    private RoleMapper roleMapper;

    /**
     * 获取所有热门角色数据，用于首页展示
     * @return 热门角色列表
     */
    @Override
    public Result<List<Role>> getPopularRoles() {
        try {
            List<Role> popularRoles = roleMapper.getPopularCharacters();
            log.info("获取热门角色数据成功，共{}个角色", popularRoles.size());
            return Result.success(popularRoles);
        } catch (Exception e) {
            log.error("获取热门角色数据失败", e);
            return Result.error("获取热门角色数据失败");
        }
    }

    /**
     * 根据分类获取角色列表
     * @param category 角色分类
     * @return 角色列表
     */
    @Override
    public Result<List<Role>> getRolesByCategory(String category) {
        try {
            List<Role> roles = roleMapper.getRolesByCategory(category);
            log.info("根据分类{}获取角色数据成功，共{}个角色", category, roles.size());
            return Result.success(roles);
        } catch (Exception e) {
            log.error("根据分类{}获取角色数据失败", category, e);
            return Result.error("获取角色数据失败");
        }
    }

    /**
     * 根据用户ID获取该用户创建的角色
     * @param userId 用户ID
     * @return 角色列表
     */
    @Override
    public Result<List<Role>> getRolesByUserId(Long userId) {
        try {
            List<Role> roles = roleMapper.getRolesByUserId(userId);
            log.info("根据用户ID{}获取角色数据成功，共{}个角色", userId, roles.size());
            return Result.success(roles);
        } catch (Exception e) {
            log.error("根据用户ID{}获取角色数据失败", userId, e);
            return Result.error("获取用户角色数据失败");
        }
    }

    /**
     * 获取所有公开角色
     * @return 所有公开角色列表
     */
    @Override
    public Result<List<Role>> getAllPublicRoles() {
        try {
            List<Role> roles = roleMapper.getAllPublicRoles();
            log.info("获取所有公开角色数据成功，共{}个角色", roles.size());
            return Result.success(roles);
        } catch (Exception e) {
            log.error("获取所有公开角色数据失败", e);
            return Result.error("获取公开角色数据失败");
        }
    }

    /**
     * 根据角色ID获取角色的voice配置
     * @param roleId 角色ID
     * @return 角色的voice配置
     */
    @Override
    public Result<String> getRoleVoiceByRoleId(Long roleId) {
        try {
            Long userId = BaseContext.getCurrentId();
            String voice = roleMapper.getRoleVoiceByUserIdAndRoleId(userId, roleId);
            if (voice != null) {
                log.info("获取用户{}的角色{}的voice配置成功", userId, roleId);
                return Result.success(voice);
            } else {
                log.warn("用户{}的角色{}不存在或无权限访问", userId, roleId);
                return Result.error("角色不存在或无权限访问");
            }
        } catch (Exception e) {
            Long userId = BaseContext.getCurrentId();
            log.error("获取用户{}的角色{}的voice配置失败", userId, roleId, e);
            return Result.error("获取角色voice配置失败");
        }
    }

    /**
     * 根据用户ID查询其拥有的所有角色（通过用户角色关联表）
     * @param userId 用户ID
     * @return 用户拥有的角色列表
     */
    @Override
    public Result<List<Role>> getOwnedRolesByUserId(Long userId) {
        try {
            List<Role> roles = roleMapper.getOwnedRolesByUserId(userId);
            log.info("根据用户ID{}获取拥有的角色成功，共{}个角色", userId, roles.size());
            return Result.success(roles);
        } catch (Exception e) {
            log.error("根据用户ID{}获取拥有的角色失败", userId, e);
            return Result.error("获取用户拥有的角色失败");
        }
    }
}